// 抽象类
abstract class Animal {
    public name;

    public constructor(name) {
        this.name = name;
    }

    // 抽象方法
    public abstract sayHi()
}

// 抽象类本身不能去实例化，需要通过子类去继承，然后由子类去实现抽象类的方法
class Cat extends Animal {
    public sayHi() {
        console.log(`My name is ${this.name}`);
    }
}

// new 的 是 子类，实现的是父类的方法
let cat = new Cat('Tom')
cat.sayHi()


/**
 * 抽象类里面可以定义抽象方法，抽象方法不包含具体实现，抽象方法只能定义在抽象类中，子类必须实现抽象方法
 * 抽象类不能被实例化
 * 抽象类里也可以定义普通方法
 */
abstract class Shape {
    width: number;

    abstract getArea(): number;

    getType() {
        return 'Shape'
    }
}

class Rectangle extends Shape {
}

class Circle extends Shape {
}

class Square extends Shape {
}
